home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / dsort / asmutys.pre < prev    next >
Text File  |  1993-07-08  |  9KB  |  311 lines

  1.     page    96,132
  2. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  3. ;§                                                                          §
  4. ;§              ディレクトリエントリ  ソート  ユーティリティ                §
  5. ;§                                                                          §
  6. ;§                                     DSORT.EXE  Ver1.30    §
  7. ;§                                                                          §
  8. ;§              Copyright (C) by 福地 邦雄 1991-1992. All rights reserved.  §
  9. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  10.     .MODEL  SMALL,C
  11.     .data
  12. ;
  13.     public  errorno         ;プログラム終了時のステータスに指定する
  14. errorno     dw      ?           ;エラーコード
  15. ;
  16. allocmsg    db  'メモリが獲得できません',0dh,0ah   ;メモリ獲得エラーの
  17. alcmsgsiz   equ     $-allocmsg              ;メッセージ
  18. ;
  19.     .code
  20. ;
  21. ;------------------------------------------------------------------------------
  22. ;
  23. ;   getargs
  24. ;       コマンドライン入力を分解してポインタのリストにする
  25. ;       空白,タブを区切り文字とする   プログラム名はサポートされない
  26. ;
  27. ;   TYPE    near call
  28. ;   IN  ds=psp
  29. ;       200h以上のスタックサイズ
  30. ;   OUT ss:bp にファーポインタリストの先頭アドレス
  31. ;       ax に文字列の個数       ゼロフラグに個数のテスト結果
  32. ;       ディレクションフラグ ダウン方向
  33. ;
  34. ;   保存レジスタ    ds のみ
  35. ;
  36. ;------------------------------------------------------------------------------
  37. ;
  38. stackwrk    equ 01c0h
  39. argcwrk     equ word ptr [bp]
  40. returnaddr  equ word ptr [bp+2]
  41. strings     equ word ptr [bp+4]
  42. cmdlen      equ ds:[80h]
  43. cmdtop      equ 81h
  44. SPC     equ 20h
  45. TAB     equ 09h
  46. ;
  47.     public  getargs
  48. getargs proc    near
  49. ;
  50.     sub     sp,stackwrk     ;文字列とポインタリスト領域の確保
  51.     mov     bp,sp
  52.     mov     ax,[bp+stackwrk]    ;リターンアドレスのセーブ
  53.     mov     returnaddr,ax
  54.     xor     ax,ax           ;ワーク領域&レジスタの初期化
  55.     mov     argcwrk,ax
  56.     mov     cx,ax
  57.     lea     di,strings
  58.     mov     cl,cmdlen       ;コマンドライン文字列長の取得
  59.     mov     si,cx
  60.     inc     cx
  61.     mov     bx,cmdtop
  62.     mov     byte ptr [si+bx],SPC    ;コマンドライン終端の改行コードを空白に
  63. ;
  64. spaceloop:              ;空白,タブをスキップする
  65.     cmp     byte ptr [bx],SPC
  66.     je      nextchar
  67.     cmp     byte ptr [bx],TAB
  68.     jne     spaceout
  69. nextchar:
  70.     inc     bx
  71.     loop    spaceloop
  72.     jmp     argend
  73. ;
  74. spaceout:               ;
  75.     mov     ss:[di],bx      ;文字列の先頭オフセットのセーブ
  76.     mov     word ptr ss:[di+2],0    ;文字列長さ初期化
  77.     lea     di,[di+4]
  78.     inc     argcwrk         ;文字列個数のカウントアップ
  79. nospcloop:
  80.     inc     word ptr ss:[di-2]  ;文字列長さのカウントアップ
  81.     dec     cx
  82.     jcxz    stringend
  83.     inc     bx
  84.     cmp     byte ptr [bx],SPC   ;空白,タブが現れるまでループ
  85.     je      stringend
  86.     cmp     byte ptr [bx],TAB
  87.     je      stringend
  88.     jmp     short nospcloop
  89. stringend:
  90.     mov     byte ptr [bx],0     ;文字列終端に 0 をセット
  91.     inc     bx
  92.     loop    spaceloop       ;空白,タブのスキップ
  93. ;
  94. argend:
  95.     mov     ax,argcwrk      ;文字列個数をチェック 0 なら終了
  96.     test    ax,ax
  97.     jnz     argsset
  98.     add     sp,stackwrk
  99.     xor     ax,ax
  100.     ret
  101. ;
  102. argsset:
  103.     mov     dx,di           ;文字列情報の最終アドレスをセーブ
  104.     mov     bx,di           ;
  105.     std             ;コピー方向=ダウンカウント
  106.     lea     di,[bp+stackwrk+1]  ;スタック最終アドレスを取得
  107.     @do until           ;文字列をスタックへコピー
  108.         lea     bx,[bx-4]
  109.         mov     cx,ss:[bx+2]        ;文字列長取得
  110.         mov     ss:[bx+2],ss        ;コピー後セグメントセット
  111.         mov     si,ss:[bx]      ;文字列終端アドレス取得
  112.         add     si,cx
  113.         inc     cx          ;終端文字分をカウントアップ
  114.         mov     es,ss:[bx+2]
  115.       rep   movsb
  116.         mov     ss:[bx],di      ;スタック上の文字列オフセット設定
  117.         inc     word ptr ss:[bx]
  118.         dec     ax
  119.     @doend (zf,on)
  120. ;                   ;ファーポインタリストのコピー
  121.     and     di,0fffeh       ;コピー先設定
  122.     lea     di,[di-2]
  123.     mov     cx,dx
  124.     mov     si,cx           ;コピー元設定
  125.     lea     si,[si-2]
  126.     sub     cx,bx
  127.     shr     cx,1            ;コピーカウント(ワード)設定
  128.     push    ds
  129.     mov     ds,ss:[si]      ;スタックセグメント取得
  130.   rep    movsw
  131.     pop     ds
  132. ;
  133.     mov     ax,argcwrk
  134.     mov     bx,returnaddr       ;リターンアドレス設定
  135.     mov     ss:[di],bx
  136.     lea     bp,[di+2]       ;ファーポインタリストのオフセット
  137.     mov     sp,di
  138.     test    ax,ax
  139.     ret
  140. ;
  141. getargs endp
  142. ;
  143. ;------------------------------------------------------------------------------
  144. ;
  145. ;   asctoint
  146. ;       アスキー10進数字列から、16ビットバイナリーへの変換
  147. ;       数字でない文字に出会った時点で終了する
  148. ;
  149. ;   TYPE    near call
  150. ;   IN  es:di アスキー10進数字列アドレス
  151. ;   OUT ax 変換した数値
  152. ;       es:di 変換時の数字でない文字のアドレス
  153. ;   保存レジスタ    bx,cx,dx,si,bp,ds,es
  154. ;
  155. ;------------------------------------------------------------------------------
  156. ;
  157.     public  asctoint
  158. asctoint    proc    uses bx cx dx
  159. ;
  160.     xor     ax,ax           ;変換中の数値&変換後通知データ
  161.     mov     cx,ax           ;獲得する(した)文字
  162.     mov     bx,10           ;10進変換のための乗数
  163.     @do repeat
  164.         mov     cl,es:[di]      ;文字獲得
  165.         @if (cl,<,'0'),or,(cl,>,'9')
  166.             @doexit
  167.         @ifend
  168.         and     cl,0fh          ;文字を数値に変換
  169.         mul     bx          ;今までの変換データを10倍
  170.         add     ax,cx           ;獲得した数値を加算
  171.         inc     di          ;次の文字位置へ
  172.     @doend
  173.     test    ax,ax           ;ゼロフラグ設定
  174.     ret
  175. ;
  176. asctoint    endp
  177. ;
  178. ;------------------------------------------------------------------------------
  179. ;
  180. ;   inttoasc0
  181. ;       16ビットバイナリをアスキー10進数字列に変換する
  182. ;       5 桁固定で 頭の 0 も出力する
  183. ;
  184. ;   TYPE    near call
  185. ;   IN  ax 16ビットバイナリ
  186. ;       es:di 変換後のアスキー10進数字列を格納するアドレス
  187. ;   OUT es:di 変換したアスキー10進数字列の次のアドレス
  188. ;   保存レジスタ    bx,cx,dx,si,bp,ds,es
  189. ;
  190. ;------------------------------------------------------------------------------
  191. ;
  192.     public  inttoasc0
  193. inttoasc0   proc    uses cx dx
  194. ;
  195.     cld             ;変換後文字列出力方向 アップ方向
  196.     mov     cx,100          ;10進変換のための除数
  197.     xor     dx,dx           ;32/16ビット除算用の上位16ビットクリア
  198.     div     cx          ;100で割る DX=余り AX=商
  199.     div     cl          ;商を更に100で割る AH=余り AL=商
  200.     add     al,'0'          ;万の位を数字文字に変換して出力
  201.     stosb
  202.     mov     al,ah           ;千,百の位を数字文字に変換して出力
  203.     aam
  204.     add     ax,'00'
  205.     xchg    ah,al
  206.     stosw
  207.     mov     al,dl           ;十,一の位を数字文字に変換して出力
  208.     aam
  209.     add     ax,'00'
  210.     xchg    ah,al
  211.     stosw
  212.     ret
  213. ;
  214. inttoasc0   endp
  215. ;
  216. ;------------------------------------------------------------------------------
  217. ;
  218. ;   dosstdout
  219. ;       MS-DOSのハンドル2番 標準出力へデータを出力する
  220. ;       エラーが起こった時はアボートする
  221. ;
  222. ;   TYPE    near call
  223. ;   IN  cx 出力データ長
  224. ;       ds:dx 出力データの先頭アドレス
  225. ;   OUT なし
  226. ;   保存レジスタ    si,di,bp,ds,es
  227. ;
  228. ;------------------------------------------------------------------------------
  229. ;
  230.     public  dosstdout
  231. dosstdout   proc
  232. ;
  233.     mov     ah,40h
  234.     mov     bx,1
  235.     int     21h
  236.     @if (cf,on)
  237.         mov     ah,4ch
  238.         int     21h
  239.     @ifend
  240.     ret
  241. ;
  242. dosstdout   endp
  243. ;
  244. ;------------------------------------------------------------------------------
  245. ;
  246. ;   dosallocx
  247. ;       MS-DOSのメモリ獲得を呼び出す、獲得出来ない時は標準出力へエラー
  248. ;       メッセージを出力してアボートする
  249. ;
  250. ;   TYPE    near call
  251. ;   IN  dx:ax 獲得したいメモリのバイトサイズ
  252. ;   OUT ax 割り当てられたメモリのセグメントアドレス
  253. ;   保存レジスタ    cx,si,di,bp,ds,es
  254. ;
  255. ;------------------------------------------------------------------------------
  256. ;
  257.     public  dosallocx
  258. dosallocx    proc   uses bx cx
  259. ;
  260.     mov     cl,4
  261.     add     ax,15
  262.     adc     dx,0
  263.     shr     ax,cl
  264.     and     dx,0fh
  265.     ror     dx,cl
  266.     mov     bx,ax
  267.     or      bx,dx
  268.     mov     ah,48h
  269.     int     21h
  270.     @if (cf,on)
  271.         mov     errorno,ax
  272.         mov     dx,offset allocmsg
  273.         mov     cx,alcmsgsiz
  274.         jmp     abort
  275.     @ifend
  276.     ret
  277. ;
  278. dosallocx    endp
  279. ;
  280. ;------------------------------------------------------------------------------
  281. ;
  282. ;   abort
  283. ;       標準出力へメッセージを出力した後、プログラム終了する
  284. ;       終了時に終了コードを設定する
  285. ;
  286. ;   TYPE    near call
  287. ;   IN  cx 出力データ長
  288. ;       ds(data):dx 出力データの先頭アドレス
  289. ;       ds(data):errorno 終了コード
  290. ;   OUT なし
  291. ;   保存レジスタ    si,di,bp,ds,es
  292. ;
  293. ;------------------------------------------------------------------------------
  294. ;
  295.     public  abort
  296. abort       proc
  297. ;
  298.     mov     ax,seg  _data
  299.     mov     ds,ax
  300.     mov     ah,40h
  301.     mov     bx,1
  302.     int     21h
  303. ;
  304.     mov     ax,errorno
  305.     mov     ah,4ch
  306.     int     21h
  307. ;
  308. abort       endp
  309. ;
  310.     end
  311.